package cn.teahouse;

import com.abdosoft.core.AbdoSoftHttpClientMain;

import java.util.HashMap;
import java.util.Map;

public class AbdoSoftHttpClient {

    String xqdh;
    String oper;
    String user;

    /**
     * @param oper    操作员
     * @param user    用户
     * @param xqdh    小区编号
     * @param flag    加密方式 0 ,表示协议内容为json明文， 1-协议内容为标准base64,2-散列base64,3-DES
     * @param url     API地址
     * @param qmzfc   签名
     * @param timeOut 超时
     */
    public AbdoSoftHttpClient(String oper, String user, String xqdh, String flag, String url, String qmzfc, int timeOut) {
        this.oper = oper;
        this.user = user;
        this.xqdh = xqdh;
        AbdoSoftHttpClientMain.initHttpClent(xqdh, flag, url, qmzfc, timeOut);
    }


    public void getToken(String password, String token, String callbackUrl) {
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("pwd", password);               /* 密码 */
        dataMap.put("http", callbackUrl);           /* 事件回调地址 */
        String ac = "ywdl"; 	                    /* 登陆协议 */
        String tp = "gettoken";                     /* 取令牌操作 */
//        String token="8888";                      /* 填鉴权用户 */
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, token, dataMap);

        String isok = re.get("isok");                //超作结果
        if ("true".equals(isok)) {
            String data = re.get("data");           //取得数据体
            String sign = re.get("sign");           //签名
            HashMap<String, String> datamap = AbdoSoftHttpClientMain.DecodeData(data, sign);//解码数据体
            token = datamap.get("token");               //读出token,后继才能操作
            AbdoSoftHttpClientMain.setToken(token);   //将tocken设置到客户端,在有效期内发送时可不用再传此参数
        }
    }

    /**
     * 获取用户门禁状态
     *
     * @param pageNo
     * @param pageSize
     */
    public Map<String, String> getUserLockStatus(int pageNo, int pageSize) {
        Map<String, String> dataMap = new HashMap<>();
        //填写协议体参数
        dataMap.put("oper", oper);      /* 协议参数，此例子只是测试连通性 */
        dataMap.put("user", user);      /* 协议参数，每个协议参数不同，参看文档配制 */
        dataMap.put("xqdh", xqdh);        //小区号
        dataMap.put("pageNo", String.valueOf(pageNo));        //页号
        dataMap.put("pageSize ", String.valueOf(pageSize));    //页大小

        //协议基本参数
        String ac = "sblock";     /* 登陆协议 */
        String tp = "listcard";   /* 读用户门禁列表 */
        //发送请求
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, dataMap);
        return processResponse(re);
    }

    /**
     * 获取指定的门禁状态
     *
     * @param sbbh 设备编号
     * @return
     */
    public Map<String, String> getLockStatus(String sbbh) {
        Map<String, String> dataMap = new HashMap<>();
        //填写协议体参数
        dataMap.put("oper", oper);/* 协议参数，此例子只是测试连通性 */
        dataMap.put("user", user);/* 协议参数，每个协议参数不同，参看文档配制 */
        dataMap.put("xqdh", xqdh);//小区号
        dataMap.put("sbbh", sbbh);//设备编号

        //协议基本参数
        String ac = "sblock"; /* 登陆协议 */
        String tp = "locksatus";/* 读设备状态 */
        //发送请求
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, dataMap);
        return processResponse(re);
    }

    /**
     * @param sbbh  设备编号
     * @param sbsbm 设备识别码
     * @return
     */
    public Map<String, String> openLock(String sbbh, String sbsbm) {
        Map<String, String> dataMap = new HashMap<String, String>();
        //填写协议体参数
        dataMap.put("oper", oper);/* 协议参数，此例子只是测试连通性 */
        dataMap.put("user", user);/* 协议参数，每个协议参数不同，参看文档配制 */
        dataMap.put("xqdh", xqdh);//小区号
        dataMap.put("sbbh", sbbh);//设备编号
        dataMap.put("sbsbm", sbsbm);//设备识别码,来自门禁列表

        //协议基本参数
        String ac = "wxtx"; /* 密码二维码 */
        String tp = "openlock";/* 开启门禁 */
        //发送请求
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, dataMap);
        return processResponse(re);
    }

    /**
     * @param sbbh  设备编号
     * @param yxday 有效天数 （最多3）
     * @param times 密码有效次数
     * @param fksjh 访客手机号码
     * @param fkxm  访客新明
     * @param fwdz  访问地址
     * @return
     */
    public Map<String, String> createLockPassword(String sbbh, int yxday, int times, String fksjh, String fkxm, String fwdz) {
        Map<String, String> dataMap = new HashMap<>();
        //填写协议体参数
        dataMap.put("oper", oper);  /* 协议参数，此例子只是测试连通性 */
        dataMap.put("user", user);/* 协议参数，每个协议参数不同，参看文档配制 */
        dataMap.put("xqdh", xqdh);//小区号
        dataMap.put("sbbh", sbbh);//设备编号
        dataMap.put("yxday", String.valueOf(yxday));//有效天数,最多3天
        dataMap.put("times", String.valueOf(times));//目前每个密码只能使用1次

        dataMap.put("fksjh", fksjh);//访客手机号
        dataMap.put("fkxm", fkxm);//房客姓名
        dataMap.put("fwdz", fwdz);//被访问地址

        //协议基本参数
        String ac = "wxtx"; /* 密码二维码 */
        String tp = "ctmm";/* 门禁密码 */
        //发送请求
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, dataMap);
        return processResponse(re);
    }

    /**
     * 取消门禁密码
     *
     * @param sbbh    设备编号
     * @param pasword 密码
     * @return
     */
    public Map<String, String> cacelLockPassword(String sbbh, String pasword) {
        Map<String, String> dataMap = new HashMap<String, String>();
        //填写协议体参数
        dataMap.put("oper", oper);/* 协议参数，此例子只是测试连通性 */
        dataMap.put("user", user);/* 协议参数，每个协议参数不同，参看文档配制 */
        dataMap.put("xqdh", xqdh);//小区号
        dataMap.put("sbbh", sbbh);//设备编号
        dataMap.put("mm", pasword);//要取消的密码

        //协议基本参数
        String ac = "wxtx"; /* 密码二维码 */
        String tp = "decode";/* 取消门禁密码 */
        //发送请求
        HashMap<String, String> re = AbdoSoftHttpClientMain.httpPost(ac, tp, dataMap);
        return processResponse(re);
    }

    private Map<String, String> processResponse(Map<String, String> response) {
        Map<String, String> result = new HashMap<>();
        if (response != null || response.size() != 0) {
            String isok = response.get("isok");//超作结果
            if ("true".equals(isok)) {
                String data = response.get("data");//取得数据体
                String sign = response.get("sign");//签名
                result = AbdoSoftHttpClientMain.DecodeData(data, sign);//解码数据体,并验证签名
            }
        }
        return mergeMaps(response,result);
    }

    public static <K, V> Map mergeMaps(Map<K, V>... maps) {
        Class clazz = maps[0].getClass(); // 获取传入map的类型
        Map<K, V> map = null;
        try {
            map = (Map) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i = 0, len = maps.length; i < len; i++) {
            map.putAll(maps[i]);
        }
        return map;
    }
}
